.text
.section .rodata
.LC0:
    .string "%s"
.LC1:
    .string "your name is:%s\n"

.text
.globl  main
.type   main, @function
main:
    pushq %rbp
    movq %rsp, %rbp
    subq $16, %rsp
    // 以下是完全按照gcc汇编生成的代码抄写过来了的，我们能看到为什么超过4个字节会报错吗？
    // name是从-12(rbp)到-8(rbp),-8(rbp)以上就是存储的%fs:40的值了，在倒数第6行会做校验
    // 跟riscv64比起来，x86_64显得比较抠搜
    // 我定义的name是4个元素，它真的只给我分配4个，超过了，就破坏了暂存的%fs:40的值，导致倒数第六行校验不通过
    // 也就是*** stack smashing detected ***: terminated打出来的原因
    movq %fs:40, %rax
    movq %rax, -8(%rbp)
    xorl %eax, %eax
    leaq -12(%rbp), %rax
    leaq    -12(%rbp), %rax
    movq    %rax, %rsi
    leaq    .LC0(%rip), %rax
    movq    %rax, %rdi
    movl    $0, %eax
    call    __isoc99_scanf@PLT
    leaq    -12(%rbp), %rax
    movq    %rax, %rsi
    leaq    .LC1(%rip), %rax
    movq    %rax, %rdi
    movl    $0, %eax
    call    printf@PLT
    movl    $0, %eax
    movq    -8(%rbp), %rdx
    subq    %fs:40, %rdx
    je      .L3
    call    __stack_chk_fail@PLT
.L3:
    leave
    ret